<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" lang="zh" xml:lang="zh">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>指南: 聚集</title>
<meta content="Guideline" name="uma.type">
<meta content="aggregation" name="uma.name">
<meta content="聚集" name="uma.presentationName">
<meta name="element_type" content="other">
<meta content="description" name="filetype">
<meta name="role" content="">
<link type="text/css" href="./../../../css/default.css" rel="StyleSheet">
<script language="JavaScript" type="text/javascript" src="./../../../scripts/ContentPageResource.js"></script><script language="JavaScript" type="text/javascript" src="./../../../scripts/ContentPageSection.js"></script><script language="JavaScript" type="text/javascript" src="./../../../scripts/ContentPageSubSection.js"></script><script language="JavaScript" type="text/javascript" src="./../../../scripts/ContentPageToolbar.js"></script><script language="JavaScript" type="text/javascript" src="./../../../scripts/contentPage.js"></script><script language="JavaScript" type="text/javascript">
					var backPath = './../../../';
					var imgPath = './../../../images/';
					var nodeInfo=[{view: "view:_LVCagP5WEdmAzesbYywanQ", path: ["_LVCagP5WEdmAzesbYywanQ", "_zRigkAILEdq-_NKqZM1EhA", "_qwxC8N7YEdmjRZts2c4ZjQ", "{DB21F5EF-810B-4994-B120-79FA8774FA9D}", "1.1538495077622037E-304"]}, {view: "view:_LVCagP5WEdmAzesbYywanQ", path: ["_LVCagP5WEdmAzesbYywanQ", "_zRigkAILEdq-_NKqZM1EhA", "_QV4x0AISEdqTna4sZVFRow", "_kjFBYN7HEdm8G6yT7-Wdqw", "{8CDAEAD4-5E84-4F50-87FD-3240ED047DE7}", "1.1538495077622037E-304"]}, {view: "view:_FCx1oN7CEdmsEI4YDGX2ag", path: ["_FCx1oN7CEdmsEI4YDGX2ag", "_f6_YwN7DEdmsEI4YDGX2ag", "_qwxC8N7YEdmjRZts2c4ZjQ", "{DB21F5EF-810B-4994-B120-79FA8774FA9D}", "1.1538495077622037E-304"]}, {view: "view:_FCx1oN7CEdmsEI4YDGX2ag", path: ["_FCx1oN7CEdmsEI4YDGX2ag", "_Jvt1cAIaEdqEutyfYo0quQ", "_EOvXUN7HEdm8G6yT7-Wdqw", "_kjFBYN7HEdm8G6yT7-Wdqw", "{8CDAEAD4-5E84-4F50-87FD-3240ED047DE7}", "1.1538495077622037E-304"]}, {view: "view:_FCx1oN7CEdmsEI4YDGX2ag", path: ["_FCx1oN7CEdmsEI4YDGX2ag", "_Jvt1cAIaEdqEutyfYo0quQ", "_jijhYAIaEdqEutyfYo0quQ", "_mTMIkN7REdmjRZts2c4ZjQ", "{8CDAEAD4-5E84-4F50-87FD-3240ED047DE7}", "1.1538495077622037E-304"]}, {view: "view:_FCx1oN7CEdmsEI4YDGX2ag", path: ["_FCx1oN7CEdmsEI4YDGX2ag", "_jD8dUAIbEdqEutyfYo0quQ", "_2ClPcDIcEdqDs_9ORT1Rig", "1.1538495077622037E-304"]}];
					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
				</script>
</head>
<body>
<div id="breadcrumbs"></div>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<td valign="top"><a name="Top"></a>
<div id="page-guid" value="1.1538495077622037E-304"></div>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td nowrap="true" class="pageTitle">指南：聚集</td><td width="100%">
<div id="contentPageToolbar" align="right"></div>
</td>
</tr>
</table>
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td class="pageTitleSeparator"><img height="1" title="" alt="" src="./../../../images/shim.gif"></td>
</tr>
</table>
<div class="overview">
<table cellpadding="0" cellspacing="0" border="0" width="97%">
<tr>
<td width="50"><img title="" alt="" src="./../../../images/guidance.gif"></td><td>
<table cellpadding="0" cellspacing="0" border="0" class="overviewTable">
<tr>
<td valign="top">聚集对模型元素之间的组成关系进行建模。本指南说明如何使用此关系。</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">关系</div>
<div class="sectionContent">
<table cellpadding="0" cellspacing="0" border="0" class="sectionTable">
<tr valign="top">
<th scope="row" class="sectionTableHeading">相关元素</th><td class="sectionTableCell">
<ul>
<li>
<a href="./../../../core.base_rup/roles/rup_designer_BA8DE74E.html" guid="{DB21F5EF-810B-4994-B120-79FA8774FA9D}">设计人员</a>
</li>
<li>
<a href="./../../../core.base_rup/tasks/class_design_98F20FF9.html" guid="{27AE0601-2E95-4A6A-8EB3-0A4BA8E5626B}">类设计</a>
</li>
<li>
<a href="./../../../core.base_rup/workproducts/rup_design_model_2830034D.html" guid="{8CDAEAD4-5E84-4F50-87FD-3240ED047DE7}">设计模型</a>
</li>
</ul>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">主要描述</div>
<div class="sectionContent">
<table cellpadding="0" cellspacing="0" border="0" class="sectionTable">
<tr valign="top">
<td class="sectionTableSingleCell"><a id="XE_aggregation__guidelines_for" name="XE_aggregation__guidelines_for" class="index" key="聚集（aggregation）" text="指南"></a><a id="Top" name="Top"></a> 
<h3>
    <a id="Introduction" name="Introduction">聚集</a>
</h3>
<p>
    聚集用于对模型元素之间的组成关系建模。组成关系有许多示例：<b>图书馆</b>有若干<b>书籍</b>，公司内的<b>部门</b>由若干<b>员工</b>组成，<b>计算机</b>由若干<b>设备</b>构成。要对此进行建模，聚集（<b>部门</b>）与其组成部分（
    <b>员工</b>）之间存在<b>聚集</b>关联。
</p>
<p>
    在聚集（整体）这一边，向关联路径的末端附加了一个空心菱形，用于指示聚集。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    在该示例中，<b>客户</b>有<b>地址</b>。由于两个类代表某个较大整体的一部分，所以我们使用聚集。我们还选择了将<b>地址</b>作为单独的类来建模，因为许多其他种类的事物也有地址。
</p>
<p class="picturecenter" align="center">
    <img height="115" alt="聚集的示例" src="./../../../core.base_rup/guidances/guidelines/resources/aggr0.gif" width="395" />
</p>
<p class="picturetext">
    一个聚集对象可将其他对象结合在一起。
</p>
<h3>
    <a id="Shared Aggregation" name="Shared Aggregation">共享的聚集</a>
</h3>
<p>
    比聚集所确定的关系的多重性更强的聚集关系称为<b>共享的</b>关系，并且破坏聚集不一定会破坏这些组成部分。由隐含意义可知，共享的聚集形成图或有许多根的树。在两个类之间存在强大的关系的情况下使用共享的聚集，因此同一实例可参与到两个不同的聚集中。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    考虑拥有家庭企业的人员的例子。“人”和“企业”都有一个“地址”，事实上这是<u>相同的</u>地址。“地址”是“人”和“企业”的不可缺少的部分。然而，“企业”可能不再存在，但“人”很可能还住在同一地址。
</p>
<p class="example">
    还要注意：在这种情况下，可能由共享的聚集开始，然后在稍后的某个日期转化为非共享的聚集。家庭企业可能壮大兴旺，最终迁到不同的地址。此时，“人”和“企业”就不再享有相同的地址了。结果，将不再共享聚集。
</p>
<p class="picturecenter" align="center">
    <img height="185" alt="聚集的示例" src="./../../../core.base_rup/guidances/guidelines/resources/aggr5.gif" width="387" />
</p>
<p class="picturetext">
    共享的聚集的示例。
</p>
<h3>
    <a id="Composition" name="Composition">组合</a>
</h3>
<p>
    <b>组合</b>是具有强大所有权、且部件的生存期与聚集一致的一种聚集形式。聚集端的多重性（在示例中为<b>订单</b>）不得大于
    1（即：它不能被共享）。并且，该聚集是无法改变的，即：一旦确定了聚集，就不能改变其链接。由隐含意义可知，组合聚集将形成由各部件组成的“树”，其中“根”是聚集，各部件是“分枝”。
</p>
<p>
    在聚集和部件之间存在强大的相互依赖关系，若没有部件，聚集定义就不完整的情况下，应使用组合聚集，而不是“普通”聚集。在下例中，在未订货（即<b>订单商品</b>）的情况下，<b>订单</b>没有意义。在某些情况下，早在分析时就可确定该相互依赖关系（就像该示例的情况），但是更常见的是直到设计时才能自信地做出这样的决策。
</p>
<p>
    如下所示，关联路径的末端附加了一个用于指示组装的实心菱形：
</p>
<p align="center">
    <img height="61" alt="组合聚集" src="./../../../core.base_rup/guidances/guidelines/resources/aggr4.gif" width="304" />
</p>
<p class="picturetext">
    组合聚集的示例
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    在该示例中，<b>客户接口</b>由若干个其他类组成。在该示例中尚未指定聚集的多重性。
</p>
<p class="picturecenter" align="center">
    <img height="161" alt="组合聚集的示例" src="./../../../core.base_rup/guidances/guidelines/resources/aggr1.gif" width="377" />
</p>
<p class="picturetext">
    <b>客户接口</b>对象知道属于它的<b>显示器、收据打印机</b>、<b>小键盘</b>和<b>扬声器</b>对象。
</p>
<h3>
    <a id="Using Composition to Model Attributes" name="Using Composition to Model Attributes">使用组装对类属性建模</a>
</h3>
<p>
    类的属性是类知道的某事物。在以上显示的<b>客户</b>类的示例中，可选择将客户<b>地址</b>作为类（我们已经知道该地址）或作为类的一组属性建模。是使用类和聚集关系，还是使用一组属性，这取决于以下因素：
</p>
<ul>
    <li>
        “属性”需要独立的身份，以便可以从若干对象引用它们吗？若是，则使用一个类和聚集。
    </li>
    <li>
        若干类需要具有相同的“属性”吗？若是，则使用一个类和聚集。
    </li>
    <li>
        “属性”的结构复杂且具有自身的属性吗？若是，则使用一个类（或若干类）和聚集。
    </li>
    <li>
        否则，使用属性。
    </li>
</ul>
<p class="exampleheading">
    示例
</p>
<p class="example">
    在<b>自动柜员机</b>中，系统必须跟踪当前的客户及其 PIN，我们假设<b>客户接口</b>负责这项工作。可将该信息视为类“属性”。可如下所示，使用单独的类来完成：
</p>
<p class="picturecenter" align="center">
    <img height="220" alt="使用聚集建模的属性" src="./../../../core.base_rup/guidances/guidelines/resources/aggr2.gif" width="173" />
</p>
<p class="picturetext" align="center">
    使用聚集建模的对象属性
</p>
<p class="example">
    另一方法是使用属性来使<b>客户接口</b>跟踪当前客户及其 PIN，对该方法建模的方式如下：
</p>
<p class="picturecenter" align="center">
    <img height="87" alt="使用属性建模的属性" src="./../../../core.base_rup/guidances/guidelines/resources/aggr3.gif" width="186" />
</p>
<p class="picturetext">
    使用属性建模的对象特征
</p>
<p>
    对于单独的类，是使用属性还是使用聚集关联，这取决于所代表的概念之间的耦合程度：当被建模的概念联系紧密时，则使用属性。当概念可能独立地发生变化时，则使用聚集。
</p>
<h3>
    <a id="XE_aggregation__association_vs._aggregation" name="XE_aggregation__association_vs._aggregation"></a><a id="XE_association__aggregation_vs._association" name="XE_association__aggregation_vs._association" class="index" key="关联（association）" text="聚集与关联"></a><a id="Aggregation or Association?" name="Aggregation or Association?">使用聚集还是关联？</a>
</h3>
<p>
    仅当类之间存在组合关系时才使用聚集，其中一个类是由其他类组成的，且“部件”在整体环境之外是不完整的。
    考虑<b>订单</b>的示例：内容“为空”而不含“任何事物”的订单是毫无意义的。对所有聚集也都如此：“部门”必须含有“员工”，“家庭”必须含有“家庭成员”等。
</p>
<p>
    若类可以在由其他类提供的环境之外具有独立的身份，若这些类不是某个更大整体的部件，那么应使用关联关系。此外，在不确定的时候，使用关联更为适合；聚集通常很明显，并且是为了帮助澄清才选择聚集。这并这不是建模工作成功的关键所在。
</p>
<h3>
    <a id="Self-Aggregations" name="Self-Aggregations">自我聚集</a>
</h3>
<p>
    有时，类可以与它自身聚集。这并不意味着该类的实例由其自身组成（这将是很愚蠢的），而是指该类的一个实例是由同类的其他实例组成的聚集。在自我聚集的情况下，角色名称对区分关联的目的尤为重要。
</p>
<p class="exampleheading">
    示例
</p>
<p class="example">
    考虑以下关于类<b>产品</b>的自我聚集：
</p>
<p class="picturetext" align="center">
    <img height="119" alt="自我聚集的示例" src="./../../../core.base_rup/guidances/guidelines/resources/assoc3.gif" width="152" />
</p>
<p class="example">
    在该示例中，产品可由其他产品组成；如果是这样，被聚集的产品称为子产品。只有从聚集到子产品的关联是可导航的；也就是说，子产品不知道它们是哪些产品的一部分（因为它们可能是许多产品的一部分）。
</p><br />
<br /></td>
</tr>
</table>
</div>
<table cellpadding="0" cellspacing="0" border="0" class="copyright">
<tr>
<td class="copyright"><p>
    &copy; &nbsp;Copyright IBM Corp.&nbsp;1987, 2006. &nbsp;All Rights Reserved.
</p></td>
</tr>
</table>
</td>
</tr>
</table>
</body>
<script language="JavaScript" type="text/javascript">
				contentPage.onload();
			</script>
</html>
